/**
 * 判断给定值是否为空
 *
 * @param val 要判断的值
 * @returns 如果值为 null、undefined 或者是一个空字符串（包括前后有空格的字符串），则返回 true；否则返回 false
 */
export function isEmpty (val: any) {
  return (
    val === null ||
    val === undefined ||
    (typeof val === 'string' && val.trim() === '')
  )
}

/**
 * 检查表单必填项是否已填写
 *
 * @param formRules 表单验证规则数组
 * @param formData 表单数据对象
 * @returns 如果所有必填项都已填写，则返回true；否则返回false
 */
export function formRequiredIsFilled (formRules: any[], formData: any) {
  // 获取tableRules中必填的字段
  let keys = [] as string[]

  Object.keys(formRules).forEach((key: string) => {
    // @ts-ignore
    let kItem = formRules[key]
    for (let i = 0; i < kItem.length; i++) {
      if (kItem[i].required) {
        keys.push(key)
      }
    }
  })
  // 遍历keys，检查formData中是否有对应的字段为空
  for (let i = 0; i < keys.length; i++) {
    if (isDeepPropertyEmpty(formData, keys[i])) {
      return false
    }
  }
  return true
}

/**
 * 检查深层嵌套对象属性是否为空
 * @param {Object} obj - 要检查的对象
 * @param {string} path - 属性路径，如 'b.c.d'
 * @returns {boolean} - 是否为空（undefined/null/空字符串）
 */
export function isDeepPropertyEmpty (obj: any, path: string) {
  if (
    !obj ||
    typeof obj !== 'object' ||
    obj === null ||
    obj === undefined ||
    (typeof obj === 'string' && obj.trim() === '')
  )
    return true

  const keys = path.split('.')
  let current = obj

  for (const key of keys) {
    if (!current.hasOwnProperty(key)) return true
    current = current[key]
    if (current === undefined || current === null) return true
  }

  return current === '' // 可以根据需要扩展其他空值判断
}

/**
 * 生成指定长度的随机字符串
 *
 * @param length 字符串的长度
 * @returns 返回生成的随机字符串
 */
export function generateRandomString (length: number = 32) {
  const characters = 'abcdefghijklmnopqrstuvwxyz0123456789'
  let result = ''
  for (let i = 0; i < length; i++) {
    const randomIndex = Math.floor(Math.random() * characters.length)
    result += characters[randomIndex]
  }
  return result
}

/**
 * 判断元素是完全可见
 *
 * @param el HTML元素
 * @param clientReact 包含客户端矩形信息的对象，包括高度和宽度属性
 * @returns 如果元素完全可见则返回true，否则返回false
 */
export function isFullyVisible (el: HTMLElement, clientReact: any) {
  const rect = el.getBoundingClientRect()
  return (
    rect.top > 0 &&
    rect.bottom < clientReact.height &&
    rect.left > 0 &&
    rect.right < clientReact.width
  )
}
